package com.yaozheng.vocationaltraining.utils;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.media.ThumbnailUtils;

import com.yaozheng.vocationaltraining.R;
import com.yaozheng.vocationaltraining.activity.BaseActivity;

/**
 * 图片帮助
 * 
 * @author Administrator
 * 
 */
public class ImageUtils {
	// /**
	// * 得到课件选项
	// *
	// * @param baseActivity
	// * @return
	// */
	// public static DisplayImageOptions getCourserDisplayImageOptions(
	// BaseActivity baseActivity) {
	// return getDisplayImageOptionsBuild(R.drawable.default_news_image)
	// .displayer(new RoundedBitmapDisplayer(5)).build();// 圆角
	// }
	//
	// /**
	// * 得到DisplayImageOptions
	// *
	// * @param defaultResource
	// * @return
	// */
	// public static DisplayImageOptions getDisplayImageOptions(int
	// defaultResource) {
	// return getDisplayImageOptionsBuild(defaultResource).build();// 圆角
	// }
	//
	// /***
	// * 得到DisplayImageOptions.Builder
	// *
	// * @param defaultResource
	// * @return
	// */
	// public static DisplayImageOptions.Builder getDisplayImageOptionsBuild(
	// int defaultResource) {
	//
	// return new DisplayImageOptions.Builder()
	// // .showImageOnLoading(defaultResource) // resource user_img
	// // drawable
	// .showImageForEmptyUri(defaultResource) // 设置图片Uri为空或是错误的时候显示的图片
	// // drawable
	// .showImageOnFail(defaultResource) // 设置图片加载/解码过程中错误时候显示的图片
	// // drawable
	// // .resetViewBeforeLoading(false) // 设置图片在下载前是否重置，复位
	// .delayBeforeLoading(0).cacheInMemory(false) // 设置下载的图片是否缓存在内存中
	// .cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中
	// .considerExifParams(false) // default
	// .imageScaleType(ImageScaleType.IN_SAMPLE_INT) // default
	// .bitmapConfig(Config.RGB_565); // default
	// }
	//
	// /**
	// * 得到头像选项
	// *
	// * @param baseActivity
	// * @return
	// */
	// public static DisplayImageOptions getUserAvatarDisplayImageOptions(
	// BaseActivity baseActivity) {
	// return getDisplayImageOptionsBuild(R.drawable.user_img).build();// 圆角
	//
	// }
	//
	// private static DisplayImageOptions PHOTO_GALLERY_DISPLAY_IMAGE_OPTIONS;
	//
	// /**
	// * 得到相册选项
	// *
	// * @return
	// */
	// public synchronized static DisplayImageOptions
	// getPhotoGalleryDisplayImageOptions() {
	// if (PHOTO_GALLERY_DISPLAY_IMAGE_OPTIONS == null) {
	// PHOTO_GALLERY_DISPLAY_IMAGE_OPTIONS =
	// createPhotoGalleryDisplayImageOptions();
	//
	// }
	// return PHOTO_GALLERY_DISPLAY_IMAGE_OPTIONS;
	// }
	//
	// private synchronized static DisplayImageOptions
	// createPhotoGalleryDisplayImageOptions() {
	// return getDisplayImageOptionsBuild(R.drawable.ic_picture_loading)
	// .build();// 圆角
	// }

	// 计算图片的缩放值
	public static int calculateInSampleSize(BitmapFactory.Options options,
			int reqWidth, int reqHeight) {
		int w = options.outWidth;
		int h = options.outHeight;
		// 想要缩放的目标尺寸
		float hh = reqHeight;// 设置高度为240f时，可以明显看到图片缩小了
		float ww = reqWidth;// 设置宽度为120f，可以明显看到图片缩小了
		// 缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可
		int be = 1;// be=1表示不缩放
		if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
			be = (int) (options.outWidth / ww);
		} else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
			be = (int) (options.outHeight / hh);
		}
		if (be <= 0)
			be = 1;
		return be;
	}

	// 根据路径获得图片并压缩，返回bitmap用于显示
	public static Bitmap getSmallBitmap(String filePath, int reqWidth,
			int reqHeight) {
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(filePath, options);

		options.inSampleSize = calculateInSampleSize(options, reqWidth,
				reqHeight);
		// Decode bitmap with inSampleSize set
		options.inJustDecodeBounds = false;
		Bitmap bitmap = null;
		Bitmap bitmap2 = null;
		try {
			bitmap = BitmapFactory.decodeFile(filePath, options);
			bitmap2 = ThumbnailUtils.extractThumbnail(bitmap, reqWidth,
					reqHeight);
			return bitmap2;
		} finally {
			if (bitmap != null) {
				if (bitmap != bitmap2) {
					bitmap.recycle();
					bitmap = null;
				}
			}
		}

	}

	/**
	 * Bitmap转byte
	 * 
	 * @param bm
	 * @return
	 */
	public static byte[] bitmap2Bytes(Bitmap bm) {
		if (bm == null)
			return null;
		ByteArrayOutputStream baos = null;
		try {
			baos = new ByteArrayOutputStream();
			bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
			return baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			if (baos != null) {
				try {
					baos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				baos = null;
			}

			if (bm != null && !bm.isRecycled()) {
				bm.recycle();
				bm = null;
			}
		}
	}

	/**
	 * 图片保存到本地
	 * 
	 * @param bitmap
	 * @param saveFile
	 * @return
	 */
	public static boolean saveBitmap(Bitmap bitmap, File saveFile) {
		if (saveFile.exists()) {
			saveFile.delete();
		} else {
			File parent = saveFile.getParentFile();
			if (!parent.exists()) {
				parent.mkdirs();
			}
		}
		FileOutputStream out = null;
		try {
			out = new FileOutputStream(saveFile);
			bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
			out.flush();
			return true;
		} catch (Exception e) {
			ErrorUtils.outErrorLog(e);
			return false;
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					ErrorUtils.outErrorLog(e);
				}
			}
			if (bitmap != null && !bitmap.isRecycled()) {
				bitmap.recycle();
				bitmap = null;
			}
		}
	}

	public static Bitmap revitionImageSize(String path) throws IOException {
		BufferedInputStream in = new BufferedInputStream(new FileInputStream(
				new File(path)));
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeStream(in, null, options);
		in.close();
		int i = 0;
		Bitmap bitmap = null;
		while (true) {
			if ((options.outWidth >> i <= 1000)
					&& (options.outHeight >> i <= 1000)) {
				in = new BufferedInputStream(
						new FileInputStream(new File(path)));
				options.inSampleSize = (int) Math.pow(2.0D, i);
				options.inJustDecodeBounds = false;
				bitmap = BitmapFactory.decodeStream(in, null, options);
				break;
			}
			i += 1;
		}
		return bitmap;
	}
}
